/**  
 * All rights Reserved, Designed By <a href="www.itttq.com" target="_blank">www.itttq.com</a>
 * @date:   2017-07-21 11:42:21
 * @Copyright: 2017 <a href="www.itttq.com" target="_blank">www.itttq.com</a> Inc. All rights reserved. 
 */
package com.itttq.gshop.pbpm.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.itttq.gshop.domain.po.UserInfoPo;
import com.itttq.gshop.domain.to.IndexStatTo;
import com.itttq.gshop.domain.to.ResultPageTo;
import com.itttq.gshop.generic.controller.GenericController;
import com.itttq.gshop.pbpm.service.UserInfoService;

@RestController
@RequestMapping("user")
public class UserInfoController extends GenericController {
	private static final long serialVersionUID = -3116967260732054L;
	public static final String CACHE_KEY = "userInfo";
	@Autowired
	private UserInfoService userInfoService;
	
	/**
	 * 根据条件获取UserInfoPo对象，并返回查询的数据总数
	 * 
	 * @param userInfo
	 * @Author 迷蝶
	 * @return List<UserInfoPo>
	 */
	@RequestMapping("users")
    public List<UserInfoPo> getUsers(@RequestBody UserInfoPo userInfo) {
        return userInfoService.getUsers(userInfo);
    }
	
	/**
	 * 根据条件获取UserInfoPo对象，并返回查询的数据总数
	 * 
	 * @param userInfo
	 * @Author 迷蝶
	 * @return ResultPageTo<UserInfoPo>
	 */
	@RequestMapping("list")
    public ResultPageTo<UserInfoPo> getUserInfos(@RequestBody UserInfoPo userInfo) {
        return userInfoService.getUserInfos(userInfo);
    }
	
	/**
	 * 根据ID获取UserInfoPo对象，并放入redis缓存
	 * 
	 * @param id	只能是数字
	 * @Author 迷蝶
	 * @return UserInfoPo
	 */
	@RequestMapping("/{id:^[0-9]*$}")
	@Cacheable(value=CACHE_KEY, key="'userInfo_'+#id")
	public UserInfoPo getUserInfo(@PathVariable("id") int id) {
		return userInfoService.getUserInfo(id);
	}
	
	/**
	 * 根据OpenID获取UserInfoPo对象，并放入redis缓存
	 * 
	 * @param openId
	 * @Author 迷蝶
	 * @return UserInfoPo
	 */
	@RequestMapping("/{openid}")
	@Cacheable(value=CACHE_KEY, key="'userInfo_'+#openid")
	public UserInfoPo getUserByOpenid(@PathVariable("openid")String openid) {
		return userInfoService.getUserByOpenid(openid);
	}
	
	/**
	 * 保存UserInfoPo对象，并清除此ID的缓存。<br>
	 * 如果ID存在，则更新对象；ID不存在则插入对象。
	 * 
	 * @param userInfo
	 * @Author 迷蝶
	 * @return UserInfoPo
	 */
	@RequestMapping("/save")
	@CacheEvict(value=CACHE_KEY, key="'userInfo_'+#userInfo.id")
	public Integer saveUserInfo(@RequestBody UserInfoPo userInfo) {
		int rs = 0;
		if(null == userInfo) {return rs;}
		if(null == userInfo.getId()) {
			rs = userInfoService.reg(userInfo);
		} else {
			rs = userInfoService.updateUserInfo(userInfo);
		}
		return rs;
	}
	
	/**
	 * 根据ID删除UserInfoPo对象，并清除此ID的缓存。<br>
	 * 
	 * @param id	只能是数字
	 * @Author 迷蝶
	 * @return UserInfoPo
	 */
	@RequestMapping("/del/{id:^[0-9]*$}")
	@CacheEvict(value=CACHE_KEY, key="'userInfo_'+#id")
	public Integer delUserInfo(@PathVariable("id") int id) {
		return userInfoService.delUserInfo(id);
	}

	/**
	 * 获取今天新增用户
	 * 
	 * @Author 迷蝶
	 * @return IndexStatTo
	 */
	@RequestMapping("getUserCountToday")
	public IndexStatTo getUserCountToday() {
		return userInfoService.getUserCountToday();
	}
	
	/**
	 * 根据手机号判断用户是否存在
	 * 
	 * @param mobile	手机号
	 * @Author 迷蝶
	 * @return boolean	存在则返回true，反之返回false
	 */
	@RequestMapping("exist")
	public boolean exist(String mobile) {
		return userInfoService.exist(mobile);
	}
	
	/**
	 * 用户注册
	 * 
	 * @param user
	 * @Author 迷蝶
	 * @return Integer
	 */
	@RequestMapping("reg")
	public Integer reg(@RequestBody UserInfoPo user) {
		return userInfoService.reg(user);
	}
	
	/**
	 * 根据手机号和密码登录
	 * 
	 * @param mobile	手机号
	 * @param pwd		密码
	 * @param ip		登录IP
	 * @Author 迷蝶
	 * @return UserInfoPo	登录成功则返回登录用户对象，用户名密码错误则返回null
	 */
	@RequestMapping("login")
	public UserInfoPo login(String mobile, String pwd, String ip) {
		return userInfoService.login(mobile, pwd, ip);
	}
	
	/**
	 * 根据手机号更新密码，需要传入手机号、salt和密码
	 * 
	 * @param userInfoPo
	 * @Author 迷蝶
	 * @return Integer
	 */
	@RequestMapping("updatePwdByMobile")
	public Integer updatePwdByMobile(@RequestBody UserInfoPo userInfo) {
		return userInfoService.updatePwdByMobile(userInfo);
	}
}